Web 前端压缩视频最大化加载速度的实践

原文链接:视频压缩到极致是种什么体验?122MB 到 4.9 MB,我的 AV1/HEVC/H.264 编码与 HTML5 播放器实践


使用不同格式确保所有场景下的体验

video 标签中使用 source 标签,标签提供了 AV1、HEVC (H.265) 和 H.264 三种编码格式。浏览器会优先选择它支持的第一个资源,从 AV1 到 HEVC 再到 H.264,确保所有设备都能播放。

代码如下,适用于产品官网的演示视频。

<video
    poster="https://cdn-domain/homepage/enterprise-1.png" playsinline autoplay loop muted loading="lazy">
    <source data-src="https://cdn-domain/homepage/enterprise-1.av1.mp4"
        type="video/mp4; codecs=av01.0.05M.08" src="https://cdn-domain/homepage/enterprise-1.av1.mp4">
    <source data-src="https://cdn-domain/homepage/enterprise-1.hevc.mp4" type="video/mp4; codecs=hvc1"
        src="https://cdn-domain/homepage/enterprise-1.hevc.mp4">
    <source data-src="https://cdn-domain/homepage/enterprise-1.mp4" type="video/mp4"
        src="https://cdn-domain/homepage/enterprise-1.mp4"><noscript></noscript>
</video>

ffmpeg 使用

生成缩略图 (封面)

使用视频第一帧做封面:

ffmpeg -i demo.mp4 -vframes 1 demo_thumbnail.png

音频处理

音频使用 AAC 编码,比特率从原始的 317 kb/s 降到了 128 kb/s (-c:a aac -b:a 128k)。使用 -movflags +faststart 参数把 moov atom(包含索引信息)移到文件开头,让视频可以边加载边播放。

AV1 编码

加入了 -cpu-used 6 参数(数值越高越快,但质量可能下降),并指定 CRF (Constant Rate Factor) 为 30 来控制质量与体积的平衡 (-crf 30,数值越大体积越小,质量越低)。同时启用多线程 -threads 0 (自动使用所有核心)。

ffmpeg -i demo.mp4 -c:v libaom-av1 -crf 30 -b:v 0 -cpu-used 6 -threads 0 -c:a aac -b:a 128k -movflags +faststart -strict -2 demo_av1_libaom.mp4

HEVC 编码

使用硬件加速的话,速度快,但是输出文件较大。

ffmpeg -i demo.mp4 -c:v hevc_videotoolbox -b:v 4000k -tag:v hvc1 -threads 0 -c:a aac -b:a 128k -movflags +faststart demo_hevc.mp4

换为软件编码方案,速度尚可,文件大小小很多。

ffmpeg -i demo.mp4 -c:v libx265 -crf 28 -preset slow -c:a aac -b:a 128k -movflags +faststart -tag:v hvc1 demo_hevc.mp4

H.264 编码

使用硬件编码,大小较大

ffmpeg -i demo.mp4 -c:v h264_videotoolbox -b:v 5000k -threads 0 -c:a aac -b:a 128k -movflags +faststart demo_h264.mp4

软编码方案,速度较慢(4~5x)

ffmpeg -i demo.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 128k -movflags +faststart demo_h264.mp4

编码效果

原视频 demo.mp4(1080p, 25fps, 约 68 秒),大小 122 MB

压缩后,保持原始分辨率 (1920x1080)、宽高比 (16:9) 和帧率 (25 fps)

demo_av1_libaom.mp4 (4.9 MB)

demo_hevc.mp4 (~5.7 MB)

demo_h264.mp4 (~6.8 MB)

实际使用

最终使用的 HTML:

<video poster="demo_thumbnail.png" playsinline autoplay loop muted loading="lazy">
      <!-- 注意 source 顺序:最优最省流的放前面 -->
      <source src="demo_av1_libaom.mp4" type="video/mp4; codecs=av01.0.04M.08">
      <source src="demo_hevc.mp4" type="video/mp4; codecs=hvc1">
      <source src="demo_h264.mp4" type="video/mp4">
      <!-- Fallback 信息 -->
      <p class="fallback">抱歉,您的浏览器似乎不支持 HTML5 视频播放。推荐使用最新版 Chrome、Firefox 或 Safari 浏览器。</p>
</video>

点此查看原文